返回
转到题目
题目思路:
- 根据题意,我们有一个代表”要求”的”01”串,我们要根据这个”01”串构造出来答案,以及想一下什么时候会无解
我们要根据这个没有规律的”01”来构造出来答案 我们定然要找到这个”一步步”具有”封闭、连贯性”的构造方法,这就是”构”造
- 如果某个位置bool_value[n]为1,那么前n位就可以成一个排列.
- 我们至少要保证,前n位一定是没有重复数字
- 这里还能得到一个推论:前n个数都要出现
- 这是我们面对一个状态”1/0”的解,而我们要考虑一个状态”01”串:
- 这样我们就要保证让每一位的构造,都要为后一位的构造留足空间
(空间为:0)
- 否则构造就会中断,运行不起来
- 这样我们就要保证让每一位的构造,都要为后一位的构造留足空间
- 我们至少要保证,前n位一定是没有重复数字
- 如果是0的话,那就是不能构成排列:
- 但是根据我们前面的推导,就算是不能成排列,这一位的构造也要为后一位留足空间
(空间为:1)
- 但是根据我们前面的推导,就算是不能成排列,这一位的构造也要为后一位留足空间
- 最后一位:
- 最后一位是不用且不能留空间的,因为后面不再有后续构造了
- 但最后一位如果是0的话,之前留的空间就会有剩余,就一定不能构造出来,也就是无解.
-
到这一步,我们就要考虑怎么构造每一位:
- 保证按要求为后一位留足空间
- 保证前n位存在且唯一:
- 由一位决定性质:
- 那我就可以利用”偏移留空间”与”补足”来实现这个机制
- 由一位决定性质:
代码实现:
l = int(input())
sub = list(map(int,[i for i in input()]))
res= []
if(sub[-1] ==0):
print(-1)
else:
prev =-1
cnt =0
for idx,e in enumerate(sub):
if(e==1):
res.append(prev+2)
prev = idx
else:
res.append(idx+2)
res = list(map(str,res))
print(" ".join(res))